package com.sitia.jd.util;

/**
 * 阿里云Oss文件工具类
 */
import com.aliyun.oss.HttpMethod;
import com.aliyun.oss.OSS;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.model.GeneratePresignedUrlRequest;
import com.aliyun.oss.model.ObjectMetadata;
import org.springframework.web.multipart.MultipartFile;

import java.io.IOException;
import java.io.InputStream;
import java.net.URL;
import java.util.Date;

/**
 * 阿里云OSS文件工具类，提供上传图片到阿里云OSS的功能。
 */
public class OssUtil {

    private static final String ENDPOINT = "<Your endpoint>";
    private static final String ACCESS_KEY_ID = "<Your Access Key ID>";
    private static final String ACCESS_KEY_SECRET = "<Your Access Key Secret>";
    private static final String BUCKET_NAME = "<Your Bucket Name>";

    /**
     * 上传图片到指定的OSS存储桶。
     *
     * @param file       要上传的图片文件
     * @param objectKey  图片在OSS中的存储路径和名称
     * @return           返回上传成功后生成的URL
     * @throws IOException 文件读取异常
     */
    public static String uploadImage(MultipartFile file, String objectKey) throws IOException {
        // 创建OSSClient实例
        OSS ossClient = new OSSClientBuilder().build(ENDPOINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);

        try {
            // 从MultipartFile中获取输入流
            InputStream inputStream = file.getInputStream();
            ObjectMetadata metadata = new ObjectMetadata();
            metadata.setContentType(file.getContentType());
            metadata.setContentLength(file.getSize());

            // 设置上传至OSS时的元数据，并上传文件
            ossClient.putObject(BUCKET_NAME, objectKey, inputStream, metadata);

            // 获取公开访问的URL（假设Bucket设置了公共读）
            Date expiration = new Date(new Date().getTime() + 3600 * 1000); // URL有效期为1小时
            GeneratePresignedUrlRequest request = new GeneratePresignedUrlRequest(BUCKET_NAME, objectKey);
            request.setMethod(HttpMethod.GET);
            request.setExpiration(expiration);
            URL url = ossClient.generatePresignedUrl(request);

            return url.toString();
        } catch (Exception e) {
            throw new RuntimeException("Failed to upload image to OSS", e);
        } finally {
            // 关闭OSSClient
            ossClient.shutdown();
        }
    }

    /**
     * 在实际项目中，应将敏感信息如ACCESS_KEY_ID、ACCESS_KEY_SECRET以及ENDPOINT存放在安全的地方，
     * 如环境变量、配置文件或密钥管理服务中，并在此处注入这些值。
     */
}


